/**
 * <copyright>
 * </copyright>
 *
 * $Id$
 */
package ccore.model;

import org.eclipse.emf.common.util.EList;

import ccore.common.CElement;
import ccore.expression.CIntVar;
import ccore.instance.CObject;

/**
 * <!-- begin-user-doc -->
 * A representation of the model object '<em><b>CClass</b></em>'.
 * <!-- end-user-doc -->
 *
 * <p>
 * The following features are supported:
 * <ul>
 *   <li>{@link ccore.model.CClass#getSuperClass <em>Super Class</em>}</li>
 *   <li>{@link ccore.model.CClass#getSubClasses <em>Sub Classes</em>}</li>
 *   <li>{@link ccore.model.CClass#isAbstract <em>Abstract</em>}</li>
 *   <li>{@link ccore.model.CClass#getFirstObject <em>First Object</em>}</li>
 *   <li>{@link ccore.model.CClass#getLastObject <em>Last Object</em>}</li>
 *   <li>{@link ccore.model.CClass#getCardinality <em>Cardinality</em>}</li>
 *   <li>{@link ccore.model.CClass#getSelfCardinality <em>Self Cardinality</em>}</li>
 *   <li>{@link ccore.model.CClass#getCObjects <em>CObjects</em>}</li>
 * </ul>
 * </p>
 *
 * @see ccore.model.ModelPackage#getCClass()
 * @model
 * @generated
 */
public interface CClass extends CElement {
	/**
	 * Returns the value of the '<em><b>Super Class</b></em>' reference.
	 * It is bidirectional and its opposite is '{@link ccore.model.CClass#getSubClasses <em>Sub Classes</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Super Class</em>' reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Super Class</em>' reference.
	 * @see #setSuperClass(CClass)
	 * @see ccore.model.ModelPackage#getCClass_SuperClass()
	 * @see ccore.model.CClass#getSubClasses
	 * @model opposite="subClasses"
	 * @generated
	 */
	CClass getSuperClass();

	/**
	 * Sets the value of the '{@link ccore.model.CClass#getSuperClass <em>Super Class</em>}' reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Super Class</em>' reference.
	 * @see #getSuperClass()
	 * @generated
	 */
	void setSuperClass(CClass value);

	/**
	 * Returns the value of the '<em><b>Sub Classes</b></em>' reference list.
	 * The list contents are of type {@link ccore.model.CClass}.
	 * It is bidirectional and its opposite is '{@link ccore.model.CClass#getSuperClass <em>Super Class</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Sub Classes</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Sub Classes</em>' reference list.
	 * @see ccore.model.ModelPackage#getCClass_SubClasses()
	 * @see ccore.model.CClass#getSuperClass
	 * @model opposite="superClass"
	 * @generated
	 */
	EList<CClass> getSubClasses();

	/**
	 * Returns the value of the '<em><b>Abstract</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Abstract</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Abstract</em>' attribute.
	 * @see #setAbstract(boolean)
	 * @see ccore.model.ModelPackage#getCClass_Abstract()
	 * @model required="true"
	 * @generated
	 */
	boolean isAbstract();

	/**
	 * Sets the value of the '{@link ccore.model.CClass#isAbstract <em>Abstract</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Abstract</em>' attribute.
	 * @see #isAbstract()
	 * @generated
	 */
	void setAbstract(boolean value);

	/**
	 * Returns the value of the '<em><b>First Object</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>First Object</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>First Object</em>' attribute.
	 * @see #setFirstObject(int)
	 * @see ccore.model.ModelPackage#getCClass_FirstObject()
	 * @model required="true"
	 * @generated
	 */
	int getFirstObject();

	/**
	 * Sets the value of the '{@link ccore.model.CClass#getFirstObject <em>First Object</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>First Object</em>' attribute.
	 * @see #getFirstObject()
	 * @generated
	 */
	void setFirstObject(int value);

	/**
	 * Returns the value of the '<em><b>Last Object</b></em>' attribute.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Last Object</em>' attribute isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Last Object</em>' attribute.
	 * @see #setLastObject(int)
	 * @see ccore.model.ModelPackage#getCClass_LastObject()
	 * @model required="true"
	 * @generated
	 */
	int getLastObject();

	/**
	 * Sets the value of the '{@link ccore.model.CClass#getLastObject <em>Last Object</em>}' attribute.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Last Object</em>' attribute.
	 * @see #getLastObject()
	 * @generated
	 */
	void setLastObject(int value);

	/**
	 * Returns the value of the '<em><b>Cardinality</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Cardinality</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Cardinality</em>' containment reference.
	 * @see #setCardinality(CIntVar)
	 * @see ccore.model.ModelPackage#getCClass_Cardinality()
	 * @model containment="true" required="true"
	 * @generated
	 */
	CIntVar getCardinality();

	/**
	 * Sets the value of the '{@link ccore.model.CClass#getCardinality <em>Cardinality</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Cardinality</em>' containment reference.
	 * @see #getCardinality()
	 * @generated
	 */
	void setCardinality(CIntVar value);

	/**
	 * Returns the value of the '<em><b>Self Cardinality</b></em>' containment reference.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>Self Cardinality</em>' containment reference isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>Self Cardinality</em>' containment reference.
	 * @see #setSelfCardinality(CIntVar)
	 * @see ccore.model.ModelPackage#getCClass_SelfCardinality()
	 * @model containment="true" required="true"
	 * @generated
	 */
	CIntVar getSelfCardinality();

	/**
	 * Sets the value of the '{@link ccore.model.CClass#getSelfCardinality <em>Self Cardinality</em>}' containment reference.
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @param value the new value of the '<em>Self Cardinality</em>' containment reference.
	 * @see #getSelfCardinality()
	 * @generated
	 */
	void setSelfCardinality(CIntVar value);

	/**
	 * Returns the value of the '<em><b>CObjects</b></em>' reference list.
	 * The list contents are of type {@link ccore.instance.CObject}.
	 * It is bidirectional and its opposite is '{@link ccore.instance.CObject#getCClass <em>CClass</em>}'.
	 * <!-- begin-user-doc -->
	 * <p>
	 * If the meaning of the '<em>CObjects</em>' reference list isn't clear,
	 * there really should be more of a description here...
	 * </p>
	 * <!-- end-user-doc -->
	 * @return the value of the '<em>CObjects</em>' reference list.
	 * @see ccore.model.ModelPackage#getCClass_CObjects()
	 * @see ccore.instance.CObject#getCClass
	 * @model opposite="cClass"
	 * @generated
	 */
	EList<CObject> getCObjects();

	/**
	 * <!-- begin-user-doc -->
	 * <!-- end-user-doc -->
	 * @model required="true"
	 * @generated
	 */
	int initId(int id);

} // CClass
